package com.abc.icespringboot.designmodes.prototypepattern;

/**
 * 7.原型模式（Prototype Pattern）
 * 定义：Specify the kinds of objects to create using a prototypical instance,
 * and create new objects by copying this prototype.
 * （用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象。）
 * <p>
 * 原型模式实际上就是实现Cloneable接口，重写clone（）方法。
 * 使用原型模式的优点：
 * ● 性能优良
 * 原型模式是在内存二进制流的拷贝，要比直接new一个对象性能好很多，特别是要在一个循环体内产生大量的对象时，原型模式可以更好地体现其优点。
 * ● 逃避构造函数的约束
 * 这既是它的优点也是缺点，直接在内存中拷贝，构造函数是不会执行的（参见13.4节）。
 * 使用场景：
 * ● 资源优化场景
 * 类初始化需要消化非常多的资源，这个资源包括数据、硬件资源等。
 * ● 性能和安全要求的场景
 * 通过new产生一个对象需要非常繁琐的数据准备或访问权限，则可以使用原型模式。
 * ● 一个对象多个修改者的场景
 * 一个对象需要提供给其他对象访问，而且各个调用者可能都需要修改其值时，可以考虑使用原型模式拷贝多个对象供调用者使用。
 * <p>
 * 浅拷贝和深拷贝：
 * 浅拷贝：Object类提供的方法clone只是拷贝本对象，其对象内部的数组、引用对象等都不拷贝，还是指向原生对象的内部元素地址，这种拷贝就叫做浅拷贝，其他的原始类型比如int、long、char、string（当做是原始类型）等都会被拷贝。
 * 注意：　使用原型模式时，引用的成员变量必须满足两个条件才不会被拷贝：一是类的成员变量，而不是方法内变量；二是必须是一个可变的引用对象，而不是一个原始类型或不可变对象。
 * 深拷贝：对私有的类变量进行独立的拷贝
 * 如：thing.arrayList = (ArrayList<String>)this.arrayList.clone();
 */
/**
 * @author hp
 * @version 1.0
 * @description: ${description}
 * @date: 13:40 2018/8/10 0010
 */
public class PrototypeClass implements Cloneable {
    @Override
    public PrototypeClass clone() {
        PrototypeClass prototypeClass = null;
        try {
            prototypeClass = (PrototypeClass) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return prototypeClass;
    }
}
